package cn.itsource.basic.service.impl;

import cn.itsource.basic.constant.VerificationConstant;
import cn.itsource.basic.exception.CustomException;
import cn.itsource.basic.service.IVerificationCodeService;
import cn.itsource.basic.util.SendMsgUtil;
import cn.itsource.basic.util.StrUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;

@Service
public class VerificationCodeServiceImpl implements IVerificationCodeService {

    @Autowired
    private RedisTemplate redisTemplate;


    /**
     * 用户注册手机发送验证码
     * @param phone
     * @throws CustomException
     */
    @Override
    public void sendUserRegMobileCode(String phone) throws CustomException {
        this.sendMobileCode(phone+":"+ VerificationConstant.USER_REG, phone);
    }

    /**
     * 微信和手机绑定发送的验证码
     * @param phone
     * @throws CustomException
     */
    @Override
    public void sendBinderMobileCode(String phone) throws CustomException {
        this.sendMobileCode(phone + ":" + VerificationConstant.USER_BINDER, phone);
    }

    /**
     * 产生的验证码有效期是5分钟，如果在1分钟以内点击了多次按钮，就提示用户，一分钟以内不能发送多次验证码，如果超过了1分钟，但在
     * 5分钟以内，依然使用第一次产生的验证码，如果超过了5分钟就发送全新的验证码
     * @param phone
     * @param key  redis的key值（验证码对应的key值）
     */
    public void sendMobileCode(String key,String phone) throws CustomException {
        //产生随机验证码
        String code = StrUtils.getComplexRandomString(4);
        //通过key值，在redis中查找验证码是否存在
        String codeValue = (String) redisTemplate.opsForValue().get(phone + ":" + VerificationConstant.USER_REG);
        //如果codeValue存在，就证明验证码还没有过期
        if(!StringUtils.isEmpty(codeValue)){
            String beginTimer = codeValue.split(":")[1];
            //结束毫秒时间-开始毫秒时间
            if((System.currentTimeMillis()-Long.valueOf(beginTimer))<60*1000){
                throw new CustomException("一分钟以内不能发送多次验证码!!");
            }
            //超过了1分钟，但依然在5分钟以内
            code = codeValue.split(":")[0];
        }
        //产生的验证码放到redis里面
        redisTemplate.opsForValue().set(key, code+":"+System.currentTimeMillis(),
                5, TimeUnit.MINUTES);
        String content = "尊敬的来宾,您的验证码为:" + code + ",请在5分钟以内完成验证操作!!";
         System.out.println(content);
        //发送短信
//        SendMsgUtil.sendMsg(phone, content);

    }
}
